package com.xbai.entity;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author jxbai
 * @desc 日期工具类
 * @date 2021/1/27
 */
public class DateUtil {

    /**
     * 时间格式
     */
    public static final String PATTERN_YYYYMMDDHH = "yyyyMMddHH";
    public static final String PATTERN_YYYY_MM_DDHHMM = "yyyy-MM-dd HH:mm";

    /**
     * 日期字符串格式转换
     *
     * @param dateStr    日期字符串
     * @param oldPattern 旧格式
     * @param newPattern 新格式
     * @return 日期字符串
     */
    public static String formatStr(String dateStr, String oldPattern, String newPattern) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(oldPattern);
        try {
            Date date = simpleDateFormat.parse(dateStr);
            simpleDateFormat = new SimpleDateFormat(newPattern);
            return simpleDateFormat.format(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取指定日期的凌晨
     *
     * @param date 日期
     * @return 日期
     */
    public static Date toDayStartHour(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }


    /**
     * 时间增加N分钟
     *
     * @param date    时间
     * @param minutes 分钟数
     * @return 时间
     */
    public static Date addDateMinutes(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 24小时制
        calendar.add(Calendar.MINUTE, minutes);
        date = calendar.getTime();
        return date;
    }

    /**
     * 时间递增N小时
     *
     * @param date 时间
     * @param hour 小时数
     * @return 时间
     */
    public static Date addDateHour(Date date, int hour) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 24小时制
        calendar.add(Calendar.HOUR, hour);
        date = calendar.getTime();
        return date;
    }

    /**
     * 获取时间菜单
     * @return 日期集合
     */
    public static List<Date> getDateMenus() {
        //定义一个List<Date>集合，存储所有时间段
        List<Date> dates = getDates(12);
        //判断当前时间属于哪个时间范围
        Date now = new Date();
        for (Date date : dates) {
            //开始时间<=当前时间<开始时间+2小时
            if (date.getTime() <= now.getTime() && now.getTime() < addDateHour(date, 2).getTime()) {
                now = date;
                break;
            }
        }

        //当前需要显示的时间菜单
        List<Date> dateMenus = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            dateMenus.add(addDateHour(now, i * 2));
        }
        return dateMenus;
    }

    /**
     * 指定时间往后N个时间间隔
     *
     * @param hours 小时数
     * @return 时间集合
     */
    public static List<Date> getDates(int hours) {
        List<Date> dates = new ArrayList<>();
        //循环12次
        //凌晨
        Date date = toDayStartHour(new Date());
        for (int i = 0; i < hours; i++) {
            //每次递增2小时,将每次递增的时间存入到List<Date>集合中
            dates.add(addDateHour(date, i * 2));
        }
        return dates;
    }

    /**
     * 时间转成yyyyMMddHH
     *
     * @param date    日期
     * @param pattern 格式
     * @return 日期字符串
     */
    public static String data2str(Date date, String pattern) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        return simpleDateFormat.format(date);
    }
}
